﻿using System.Collections.Generic;
using System.Linq;
using ControleRepresentanteSync.Application.DynamicSync;
using ControleRepresentanteSync.ControleRepresentanteServices;
using ControleRepresentanteSync.Logic;

namespace ControleRepresentanteSync.Application.Pedido
{
    internal class PedidoSyncPresenter : DynamicSyncPresenter<IPedidoSyncViewModel, IPedidoViewModel, IPedidoListViewModel, PedidoContract>
    {
        public PedidoSyncPresenter(IWindow window, IPedidoSyncViewModel pedidoSyncViewModel, IEnumerable<IPedidoViewModel> pedidos, IViewModelFactory viewModelFactory, IUserInterfaceService userInterfaceService, ISyncServiceProvider syncServiceProvider) 
            : base(window, pedidoSyncViewModel, pedidos, userInterfaceService, syncServiceProvider, viewModelFactory)
        {
        }

        protected override IEnumerable<IPedidoViewModel> GetOrderedContents(IEnumerable<IPedidoViewModel> contents)
        {
            return contents.OrderBy(x => x.Numero);
        }

        protected override void Synchronize(SyncService syncService, PedidoContract[] contracts)
        {
            syncService.Synchronize(contracts);
        }

        protected override PedidoContract ConvertToContract(IPedidoViewModel contentViewModel)
        {
            return new PedidoContract
            {
                ClienteId = contentViewModel.Cliente.Contract.Id,
                CondicaoPagamento = contentViewModel.CondicaoPagamento,
                Data = contentViewModel.Data,
                Desconto = contentViewModel.Desconto,
                FabricaId = contentViewModel.Fabrica.Contract.Id,
                Numero = contentViewModel.Numero.ToString(),
                Observacao = contentViewModel.Observacao,
                PrazoEntrega = contentViewModel.PrazoEntrega,
                TransportadoraId = contentViewModel.Transportadora.Contract.Id,
                VendedorId = contentViewModel.Vendedor.Contract.Id,
                Produtos = contentViewModel.Produtos
                    .Select(produtoItem => new ProdutoContract
                    {
                        Codigo = produtoItem.Codigo,
                        Descricao = produtoItem.Descricao,
                        PrecoUnitario = produtoItem.PrecoUnitario,
                        Quantidade = produtoItem.Quantidade
                    })
                    .ToArray(),
                AttributeValues = contentViewModel.AttributeList.GetAttributeValues(),
                TotalMercadoria = contentViewModel.TotalMercadoria,
                TotalLiquido = contentViewModel.TotalLiquido,
                ValorImposto = contentViewModel.ValorImposto
            };
        }
    }
}